package com.cdtu.backend;

import com.cdtu.backend.utils.CommonUtil;
import com.cdtu.backend.utils.FileUtil;
import com.cdtu.backend.utils.MediaUtil;
import lombok.extern.slf4j.Slf4j;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.Scanner;

/**
 * @author Mika
 * @date 2023/08/18 19:50
 * Starter 启动器类：负责详细的启动流程
 **/
@Slf4j
public class Starter {
    // 默认 C 盘安装
    public static final String DEFAULT_INSTALL_PATH = "C:/Program Files/Genshin Impact";
    public static final String GAME_DIRECTORY = "Genshin Impact Game";
    // 游戏本体存放位置固定前缀
    public static final String PREFIX = GAME_DIRECTORY + "/";

    // 启动游戏名称
    public static final String GAME_START_NAME = "YuanShen";
    // 背景音乐
    public static final String BACKGROUND_MUSIC = "Shed a Light.mp3";
    public void start() {
        CommonUtil.banner();
        CommonUtil.waitSomeTime();
        log.info("欢迎使用原神启动器！！！");
        log.info("Version:1.0\n");
        CommonUtil.waitSomeTime();
        // 游戏实际安装位置
        // 测试使用路径：E:/Game/Application/Genshin Impact_yuanshen/
        String actuallyInstallPath = "";
        // 1.查找游戏
        log.info("正在查找游戏中，请稍后...");
        String path = find();
        if (Objects.equals(path, "")) return;
        actuallyInstallPath = path + "/";
        // 2.拼接游戏启动路径
        String application = actuallyInstallPath + PREFIX + GAME_START_NAME + ".exe";
        CommonUtil.waitSomeTime();
        // 3.原神，启动！！！
        CommonUtil.chineseBanner();
        CommonUtil.waitSomeTime();
        log.info("原神，启动！！！");
        try {
            startProgram(application);
        } catch (IOException e) {
            log.error("应用程序：" + application + "不存在！");
            throw new RuntimeException(e);
        }
        // 4.播放背景音乐
        System.out.println();
        MediaUtil.playMusic(BACKGROUND_MUSIC);
    }
    private String find() {
        String path = DEFAULT_INSTALL_PATH;
        path = defaultFind(path);
        if (!path.isEmpty()) return path;
        //   1.2若找不到，则输入游戏路径
        System.out.println();
        CommonUtil.waitSomeTime();
        log.error("自动检索未能找到游戏路径！！！");
        System.out.println();
        // 加个手动输入开关：
        boolean isType = false;
        // Y/y 表示需要输入；N/n 表示不需要输入，直接启动原神
        log.info("您需要手动启动，还是直接启动原神？");
        log.info("Y/y 表示需要输入原神安装路径；N/n，回车或其他表示不用，直接快速启动原神");
        Scanner scanner = new Scanner(System.in);
        String confirmStr = scanner.nextLine();
        if (confirmStr.equals("Y") || confirmStr.equals("y")) {
            path = CommonUtil.typePath();
        }
        else {
            MediaUtil.directPlayVideo("boot.mp4");
        }
        return path;
    }
    // 默认查找策略
    private String defaultFind(String path) {
        //   1.1遍历默认的 C/D/E 盘路径
        for (int i = 0; i < 3; i++) {
            // 第一次后切换盘符
            if (i > 0) path = FileUtil.changeDisk(path);
            log.info("切换盘符，目标地址修改为：" + path);
            if (FileUtil.isExistedDirectory(path)) {
                // 需要判断该目录下是否含有子文件夹 Genshin Impact Game
                if (!FileUtil.containChildDirectory(path, GAME_DIRECTORY)) continue;
                log.info("成功找到游戏，路径为：" + path);
                return path;
            }
        }
        return "";
    }
    // 启动应用程序
    public void startProgram(String path) throws IOException {
        log.info("启动应用程序：" + path);
        if (path.isEmpty() || path.equals("\r\n")) {
            log.error("错误：路径为空");
            return;
        }
        Desktop.getDesktop().open(new File(path));
    }

}
